package com.koocloud.electroplatemanage.utils;

import com.alibaba.druid.util.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class PojoUtil {

    /**
     * 相同pojo复制
     *
     * @param source 源
     * @param target 目标
     */
    public static void copy(Object source, Object target) {

        try {

            Class<?> sourceClass = source.getClass();// 得到对象的Class
            Class<?> targetClass = target.getClass();// 得到对象的Class

            Field[] sourceFields = sourceClass.getDeclaredFields();// 得到Class对象的所有属性
            Field[] targetFields = getAllFields(targetClass);// 得到Class对象的所有属性
            for (Field sourceField : sourceFields) {

                String name = sourceField.getName();// 属性名
                Class<?> type = sourceField.getType();// 属性类型

                String methodName = name.substring(0, 1).toUpperCase() + name.substring(1);

                try {
                    Method getMethod = sourceClass.getMethod("get" + methodName);// 得到属性对应get方法
                    Object value = getMethod.invoke(source);// 执行源对象的get方法得到属性值
                    for (Field targetField : targetFields) {
                        String targetName = targetField.getName();// 目标对象的属性名

                        if (targetName.equals(name)) {
                            Method setMethod = targetClass.getMethod("set" + methodName, type);// 属性对应的set方法

                            setMethod.invoke(target, value);// 执行目标对象的set方法
                            break;
                        }
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                }

            }

        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    /**
     * 取得实体类所有成员，包括父类
     *
     * @param clazz
     * @return
     * @author 吴子晨
     */
    public static Field[] getAllFields(Class<?> clazz) {
        List<Field> fieldList = new ArrayList<>();
        while (clazz != null) {
            fieldList.addAll(Arrays.asList(clazz.getDeclaredFields()));
            clazz = clazz.getSuperclass();
        }
        Field[] fields = new Field[fieldList.size()];
        fieldList.toArray(fields);
        return fields;
    }

    public static void nullToStr(Object entity) {

        try {

            Class<?> sourceClass = entity.getClass();// 得到对象的Class
            Class<?> targetClass = entity.getClass();// 得到对象的Class

            Field[] sourceFields = sourceClass.getDeclaredFields();// 得到Class对象的所有属性
            Field[] targetFields = targetClass.getDeclaredFields();// 得到Class对象的所有属性

            for (Field sourceField : sourceFields) {

                String name = sourceField.getName();// 属性名
                Class<?> type = sourceField.getType();// 属性类型
                if (!StringUtils.equals(type.getName(), "java.lang.String")) {
                    continue;
                }
                String methodName = name.substring(0, 1).toUpperCase() + name.substring(1);

                try {
                    Method getMethod = sourceClass.getMethod("get" + methodName);// 得到属性对应get方法
                    Object value = getMethod.invoke(entity);// 执行源对象的get方法得到属性值
                    if (value == null) {
                        value = "";
                    }
                    for (Field targetField : targetFields) {
                        String targetName = targetField.getName();// 目标对象的属性名

                        if (targetName.equals(name)) {
                            Method setMethod = targetClass.getMethod("set" + methodName, type);// 属性对应的set方法
                            setMethod.invoke(entity, value);// 执行目标对象的set方法
                            break;
                        }
                    }

                } catch (Exception e) {
                    // TODO: handle exception
                }

            }

        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}
